import COS = require('cos-nodejs-sdk-v5');
import { nanoid } from 'nanoid';
import dayjs = require('dayjs');
import * as path from 'path';
import * as Fs from 'fs';
import { CONFIG } from '@/config/env/dotenv';
import { FilePath, Result, UploadFile, UploadStatus } from './upload.interface';

// SECRETID 和 SECRETKEY请登录 https://console.cloud.tencent.com/cam/capi 进行查看和管理
const cosObject = new COS({
  Protocol: CONFIG['MY_NEST_APP_COS_PROTOCOL'],
  SecretId: CONFIG['MY_NEST_APP_COS_SECRET_ID'],
  SecretKey: CONFIG['MY_NEST_APP_COS_SECRET_KEY'],
});

const bucketName = CONFIG['MY_NEST_APP_COS_DEFUAL_STORAGE_TYPE'];
// 地区， 此处填写你的存储桶位置
const region = CONFIG['MY_NEST_APP_COS_REGION'];

const defaultStorgeType = CONFIG['MY_NEST_APP_COS_DEFUAL_STORAGE_TYPE'];

const defaultStorageClass = CONFIG['MY_NEST_APP_COS_DEFUAL_STORAGE_CLASS'];

/**
 * 获取文件的拓展名
 * @param {*} filename
 * @returns 文件的拓展名
 */
function getExtension(filename = '') {
  // const ext = path.extname(filename || '').split('.');
  return path.extname(filename);
}

function getCosObjectKey(filePath = '') {
  return filePath.replace(/[^\/]*/, '');
}

function getFoldarPathForDate() {
  return `/${dayjs().format('YYYY')}/${dayjs().format('MM')}/${dayjs().format(
    'DD',
  )}`;
}

function getRandomName() {
  return `${dayjs().format('YYYY-MM-DD-HH-mm-ss-SSS')}-${nanoid()}`;
}

/**
 * 获取随机文件名字
 * @param {*} filename 文件名（包括拓展名）
 * @param {*} storgeType 存储类别
 * @param {*} extension 文件存储拓展名，可选
 * @returns 不重复文件名
 */
function getRandomFileName(filename, storgeType = '', extension = '') {
  return `${
    storgeType ? `/${storgeType}` : ''
  }${getFoldarPathForDate()}/${getRandomName()}${
    extension || getExtension(filename)
  }`;
}

/**
 * cos上传图片方法
 * @param {*} file 文件上传对象
 * @param {*} storgeType 存储首路径，默认为: defaultStorgeType
 * @returns
 */
function uploadFile(file: Express.Multer.File, storgeType = defaultStorgeType) {
  const fileObject = Fs.readFileSync(file.path);
  return new Promise<string>((resolve, reject) => {
    cosObject.putObject(
      {
        Bucket: bucketName /* 填入您自己的存储桶，必须字段 */,
        Region: region /* 存储桶所在地域，例如ap-beijing，必须字段 */,
        Key: getRandomFileName(
          file.filename,
          storgeType,
        ) /* 存储在桶里的对象键（例如1.jpg，a/b/test.txt），必须字段 */,
        StorageClass: defaultStorageClass as COS.StorageClass,
        Body: fileObject, // 上传文件对象
      },
      function (err, data) {
        if (err) {
          console.log('err', err);
          reject(err);
          return;
        }
        console.log('cosObject', data);
        const { Location } = data;
        const url = Location.replace('.cos-internal.', '.cos.');
        console.log(url);
        resolve(`https://${url}`);
      },
    );
  });
}

/**
 * cos文件删除
 * @param {*} filePath 文件路径
 * @returns
 */
function deleteFile(filePath) {
  return new Promise((resolve, reject) => {
    cosObject.deleteObject(
      {
        Bucket: bucketName /* 填入您自己的存储桶，必须字段 */,
        Region: region /* 存储桶所在地域，例如ap-beijing，必须字段 */,
        Key: getCosObjectKey(
          filePath,
        ) /* 存储在桶里的对象键（例如1.jpg，a/b/test.txt），必须字段 */,
      },
      function (err, data) {
        if (err) {
          reject(err);
          return;
        }
        resolve(data);
      },
    );
  });
}

export class CosUploadFile extends UploadFile {
  public uploadFile(file: Express.Multer.File): FilePath | Promise<FilePath> {
    return uploadFile(file);
  }

  public deleteFile(filePath: string): Result | Promise<Result> {
    console.log(filePath);
    return {
      code: UploadStatus.SUCCESS,
      message: '',
    };
  }
}

export {
  uploadFile,
  deleteFile,
  getRandomFileName,
  getFoldarPathForDate,
  getRandomName,
};
